package org.aerie.forest.extensions.base.rebar.tool;

import java.util.regex.Pattern;

import org.aerie.forest.core.frame.rebar._shelf.ForestInitShelf;
import org.aerie.forest.core.frame.rebar.entity.processer.exception.ExceptionProcessor;
import org.aerie.forest.core.frame.rebar.entity.tool.ForestTool;
import org.aerie.forest.core.frame.rebar.factory.ForestFactory;
import org.aerie.forest.extensions.base.brick.exception.RegularCheckException;

/**
 * @description 正则表达式处理器
 *
 * @author quark
 * @organization aerie
 * @date 2020年2月28日 下午2:14:28
 * @version 1.2.0
 */
public final class RegularTool extends ForestTool {

	/**
	 * @description 单例
	 * 
	 * @author quark
	 * @date 2020年2月28日 下午2:14:44
	 */
	private static volatile RegularTool regularTool;

	/**
	 * Construction
	 * 
	 *
	 * @date 2020年2月28日 下午2:14:52
	 */
	private RegularTool() {
		super("正则工具");
		LOGGER.info(LogMsgPool.INIT_COMPLETE , forestFrameName);
	}

	/**
	 * @description 获得类工具单例
	 * @return 类工具
	 *
	 * @date 2020年2月28日 下午2:15:26
	 */
	static final RegularTool getInstance() {
		/**
		 * 双重锁
		 */
		if (regularTool == null) {
			synchronized (ClassTool.class) {
				if (regularTool == null) {
					regularTool = new RegularTool();
				}
			}
		}
		return regularTool;
	}

	/**
	 * @description 判断是否是正则【只是做了最最最基本的长度等校验】
	 * @param regular 判断结果
	 * @throws Exception 校验异常
	 *
	 * @date 2020年2月28日 下午2:17:48
	 */
	private void isRegular(String regular) throws Exception {
		if (null == regular || regular.length() <= 2 || !regular.startsWith("^") || !regular.endsWith("$")
				|| regular.length() != regular.replace(" ", "").length()) {
			throw new RegularCheckException();
		}
	}

	/**
	 * @description 正则校验字符串
	 * @param regular 正则表达式
	 * @param checked 被校验的字符串
	 * @return 校验结果
	 *
	 * @date 2020年2月28日 下午2:33:11
	 */
	public boolean conformRegular(String regular, String checked) {
		try {
			// 校验正则表达式
			isRegular(regular);
			// 校验被校验的字符串
			if (null == checked || checked.trim().length() == 0)
				throw new RegularCheckException("被校验的字符串不能为null或''");
			// 正则校验并返回校验结果
			return Pattern.compile(regular).matcher(checked).matches();
		} catch (Exception e) {
			// 为了不阻断,这里内部处理校验异常
			((ExceptionProcessor) ForestFactory.INSTANCE
					.getForestRebarFactory(ForestInitShelf.getInstance().EXCRPTION_PROCESSOR)).recordException("正则校验失败",
							e);
			return false;
		}
	}

}
